之前有說過我們團隊每週會刷leetcode,幾乎1000題內都是在考資料結構+演算法,資料結構像是你身上裝備的武器,而演算法則是你真正的武功。而物件導向/設計模式像是魔法一樣,讓你程式寫得更漂亮精簡。
例如上週P同學所帶來的這題:
https://leetcode.com/problems/valid-parentheses/
leetcode的題目乍看都不難(如果英文還ok的話,不ok就是順便練英文),要盡可能先把題目讀懂。也不要刷題時有壓力,並不是為了面試,而是去動腦去玩程式碼。每個人寫出來的都不一樣,這就跟藝術創作一樣,沒有絕對答案。是很有趣的。
這題答案如果知道一個關鍵資料結構,基本上秒解。
var isValid = function (s) {
const ar = s.split("")
let stack = []
for(let i=0;i<ar.length;i++){
if(ar.length != 0 && (
(stack[(stack.length - 1)] === "(" && ar[i] === ")") ||
(stack[(stack.length - 1)] === "[" && ar[i] === "]") ||
(stack[(stack.length - 1)] === "{" && ar[i] === "}") )){
stack.pop();
} else {
stack.push(ar[i]);
}
}
return stack.length === 0
};
這一題資料結構就是stack,如果這題不用stack去解決,可能就要搞很久了。然後再搭配先進先出排程演算法,逐一拆解字串到陣列,因為只有三種括號類型,且跑一次迴圈,時間複雜度為O(n)。
很多人不知道怎麼訓練自己的程式技巧。如果你都還不知道資料結構中的Queue、Stack或Linked List有什麼不同,sort有哪幾種的話,那絕對不是一直刷題就能增進程式技巧。
馬步還沒打穩,就想學降龍十八掌?
如果非本科系,建議直接回學校大學部修課,可以申請在職進修或者假日班,價格親民;或者直接像逃學威龍電影一樣,混進學校旁聽就好,這事情我也常做。重點在學習,不是拿到學分;再來就是找一些網路上的免費教學,太多了請自己google;最差的就是去民間的資訊類補習班,昂貴又不一定打底打的好。
一些大學書單推薦:
資料結構理論與實務: 以C語言實作 (第三版)
資料結構-使用 C 語言
演算法導論(Introduction to Algorithms)
推薦讀作業系統。因為作業系統就是集眾多資料結構與演算法於一身的東西。
作業系統概論(恐龍本)
上述的書都有中文版可以找的到。
再來就是物件導向。
物件導向是你一生都必須要學的觀念 - 阿爾伯特·愛因斯坦(教授的話很好用)
為何要如此推崇物件導向。物件導向不只是用在資訊領域或程式設計,還有你的人生道路上。
這世界就是由物件組成的。物件三大特性,封裝、繼承、多型。
封裝代表你對你的人生收納整理的能力,你應該專注在將知識歸納,封裝成自己可以不斷重複使用,並同中求變的東西。
繼承不是找一個富爸爸,而是找到這世界彼此的關聯性,建立典範轉移的迅速過程,比如你若發現每一個程式語言其實都有一個共同的父類別繼承,你就會發現應該要先學會那個父類別裡面的東西,然後透過繼承快速轉移學習到另外一個語言。
多型是當你在這世界遊走久了後,你會發現一件事情可以有很多描述,一個相同功能在不同的物件裡,可能有不同的解釋與輸出,再透過物件與物件之間的類別關係,你就會找到與你不同成長背景的人,在產生多型描述時,有可能的相同點,藉此達成共識。
之前團隊中的Y君與W君有一起研讀此書,不是專注在程式本身(此書用Java寫的),但一些觀念還不錯,可以參考。
像是SOLID(單一功能、開閉原則、里氏替換、介面隔離以及依賴反轉)的描述,都可以在你的生活上得到解釋與應用。